package com.tedu.API.io;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.logging.Filter;

/**
 * listFiles(接口: FileFilter)   重载
 * 作用: 按照"指定规则"获取对应文件/文件夹
 *
 * Filter接口---专门给listFiles方法提供: 过滤文件夹或者文件【指定规则】
 * accept() 从每个File的文件中判断，拿到【具体逻辑】的文件夹
 *
 * 需求: 获取API项目下的所有子项【文件和文件夹】，获取src文件
 *      指定规则: 验证是s开头就是src
 *
 * 作业2: FileFilter接口按照 匿名内部类  方式  实现，  功能如上需求!
 *    接口: FileFilter ff=new  FileFilter()  { accept() }
 */
public class FilterAPI {
    //主方法: ./ 路径指定根级
    /*public static void main(String[] args) throws IOException {
        //1.创建File文件类: 获取当前 API 文件夹   路径:./
        File file=new File("."+File.separator+"API");
        System.out.println(file.getCanonicalPath());
        //4.创建FileFilter接口对象---无法直接创建: 实现类--实现--接口【创建】
        MyFilter my=new MyFilter();
        FileFilter ff= new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                String str=pathname.getName();
                System.out.println("获取文件夹名字: "+str);
                return str.startsWith("A");
            }
        };

        //2.获取文件夹下的所有"子项: 文件夹下包括所有文件和文件夹"
        File[] subs=file.listFiles(ff);
        //3.打印子项下的所有名字
        for (int i=0;i< subs.length;i++){  //i   下标   从0开始
            System.out.println("所有的文件和文件夹名字"+subs[i].getName());
        }*/

        //匿名内部类方式:
        public static void main(String[] args) throws IOException {
            //1.创建File文件类:获取当前 API 文件夹  路径： ./
            File file = new File("." + File.separator + "API");
            System.out.println("路径：" + file.getCanonicalPath());
            //4.创建Filter接口对象---无法直接创建：实现类--实现--接口【创建】
           /* FileFilter my = new FileFilter() {
                public boolean accept(File pathname) {
                    String name = pathname.getName();
                    System.out.println("过滤出来文件夹名字：" +name);
                    return pathname.getName().startsWith("s");
                }
            };*/

            //Lambda表达式写法:
            //方法一:
           /* FileFilter my=(pathname)->{return pathname.getName().startsWith("s");};
            //2.获取文件夹下的所有“子项：文件夹下包括所有文件和文件夹”
            File[] subs = file.listFiles(my);
            //3.打印子项下所有名字
            for (int i = 0; i < subs.length; i++) {
                System.out.println("子项所有名字：" + subs[i].getName());
            }*/

            //方法二:
            /*File[] subs = new File("." + File.separator + "API").
                    listFiles((pathname)->{return pathname.getName()
                            .startsWith("s");});*/
            //3.打印子项下所有名字   普通for改成增强for
            /*for (int i = 0; i < subs.length; i++) {
                System.out.println("子项所有名字：" + subs[i].getName());
            }*/
            //增强for  for(增强类型 f:){}
            for (File file1:new File("." + File.separator + "API").
                    listFiles((pathname)->{return pathname.getName()
                            .startsWith("s");})){
                System.out.println("遍历后进行过滤完成的内容: "+file1);
            }
        }
    }
    //单元测试: ./ 路径指定父级
   /* @Test
    public void test01() throws IOException {
        //创建File文件类: 获取当前 API 文件夹   路径:./
        File file=new File("."+File.separator);
        System.out.println(file.getCanonicalPath());
    }*/
//创建一个实现类---实现---FileFilter接口---对象创建
class MyFilter implements FileFilter {
    //accept(File pathname)方法:
    //传入参数: File pathname--获取所有需要过滤文件
    //作用: 添加一个过滤条件，将我们获取到的需要过滤的文件，逐一过滤
    //     过滤条件【条件: 规则---开发者指定】满足返回true，
    //     条件不满足，则相反
    public boolean accept(File pathname) {
        //添加规则: 文件或者文件夹是 s 开头 -- 过滤
        //①获取到所有文件夹的名字
        String name= pathname.getName(); //文件夹: src  字符串
        //②过滤以 s 开头的文件夹
        // 字符串: startWith("s") 返回值: boolean
        // 作用:   验证字符串首字符是不是匹配字符，如果匹配: 返回true，反之不匹配
        //③打印过滤出现的字符串
        System.out.println("过滤出的文件夹名字是: "+name);
        return name.startsWith("s");
    }
}

